﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace AhgoraParser.Library.Libs
{
    public class AhgoraWebParser
    {
        const string DATA_REGEX = @"[0-9]{2}\/[0-9]{2}\/[0-9]{4}";
        const string HORAS_REGEX = @"((0?\d|1\d|2[0-3])\:[0-5]\d\s*,?\s*)+";
        readonly Regex horaRegex;
        readonly Regex dataRegex;

        /// <summary>
        /// Conteudo html
        /// </summary>
        string html;
        List<string> linhas;
        HtmlDocument documento;
        List<BatidaControle> batidas;
        public AhgoraWebParser(string html)
        {
            this.html = html;
            dataRegex = new Regex(DATA_REGEX);
            horaRegex = new Regex(HORAS_REGEX);
            documento = new HtmlDocument();
            documento.LoadHtml( html );
            ParsearLinhas();
            ParsearBatidas();
        }

        private void ParsearLinhas()
        {
            linhas = new List<string>();
            var tableRows = documento.DocumentNode.SelectNodes( "//tr" );
            if(tableRows != null)
            {
                foreach(var item in tableRows)
                {
                    linhas.Add( item.WriteTo() );
                }

                linhas = linhas.Where( o => dataRegex.IsMatch( o ) ).ToList();
            }
        }

        private void ParsearBatidas() 
        {
            batidas = new List<BatidaControle>();
            BatidaControle batida;
            List<TimeSpan> registros;
            foreach(var linha in linhas)
            {
                var data = GetData( linha );
                var horas = GetHoras(linha);
                if(horas == null)
                    continue;
                registros = ConverterHorariosToTimeSpan( horas);
                batidas.Add( new BatidaControle( data, registros,horas ) );
            }
        }

        private DateTime GetData(string linha) 
        {
            var valores = dataRegex.Match( linha ).ToString().Split('/').Select(o=>Convert.ToInt32(o)).ToArray();
            DateTime data = new DateTime( valores[2], valores[1], valores[0] );
            return data;
        }

        private string GetHoras(string linha) 
        {
            return horaRegex.Match( linha ).ToString();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="horarios"></param>
        /// <returns></returns>
        public List<TimeSpan> ConverterHorariosToTimeSpan( string horarios )
        {
            List<TimeSpan> horariosTimeSpan;
            if(ValidarStringHorarios( horarios ))
                return horariosTimeSpan = horarios.Split( ',' ).Select( o => ConverterHorarioToTimeSpan( o.Trim() ) ).OrderBy( o => o.Ticks ).ToList();
            else
                return new List<TimeSpan>();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="valorHoraEmString"></param>
        /// <returns></returns>
        private static TimeSpan ConverterHorarioToTimeSpan( string valorHoraEmString )
        {
            int horas, minutos;
            string[] valoresSplit = valorHoraEmString.Split( ':' );
            horas = Convert.ToInt32( valoresSplit[0] );
            minutos = Convert.ToInt32( valoresSplit[1] );
            return new TimeSpan( horas, minutos, 0 );
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="horario"></param>
        /// <returns></returns>
        public bool ValidarStringHorarios( string horario )
        {
            if(string.IsNullOrWhiteSpace( horario ) || !horaRegex.IsMatch( horario ))
                return false;
            else
                return true;
        }

        public List<BatidaControle> GetRegistros() 
        {
            return batidas;
        }
    }
}
